home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
076-100
/
disk_079
/
sharedlib
/
2tasks.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
4KB
|
169 lines
/* 2Tasks.C James M Synge, May 18, 1987 */
/* Include files */
#include "exec/types.h"
#include "exec/nodes.h"
#include "exec/lists.h"
#include "exec/tasks.h"
#include "exec/libraries.h"
#include "exec/ports.h"
/* Other declarations */
struct Library *TaskBase, /* Library Base Pointer. */
*OpenLibrary();
struct MsgPort *CreatePort(), *FindPort();
struct Message *WaitPort(), *GetMsg();
#define TASK_LIBRARY "task.library"
#define TASK_VERSION 1L
#define CHILD_PORT "2Tasks.Child.Port"
#define CHILD_TASK "2Tasks.Child.Name"
main()
{
struct Message message, *msg;
struct MsgPort *ParentPort, *ChildPort;
struct Task *ChildTask, *CreateTask();
void ChildMain();
int seconds;
/* First things first: Open the task library: */
printf("Openning %s\n", TASK_LIBRARY);
TaskBase = OpenLibrary(TASK_LIBRARY, TASK_VERSION);
if (TaskBase == 0L) {
printf("Unable to open %s\n", TASK_LIBRARY);
exit(10);
}
/* Create a nameless MsgPort where we can receive
* the reply to a message.
*/
if ((ParentPort = CreatePort( 0L, 0L )) == 0L) {
printf("Unable to create a MsgPort!\n");
CloseLibrary( TaskBase );
exit(10);
}
/* Now create the child task. */
printf("Creating the child task.\n");
ChildTask = CreateTask(
CHILD_TASK, /* Name of the task. */
1L, /* Higher priority. */
ChildMain, /* Its main routine. */
4096L); /* Stack Size. */
if (ChildTask == 0L) {
printf("Unable to create child task!\n");
DeletePort( ParentPort );
CloseLibrary( TaskBase );
exit(10);
}
/* Find the child's message port. */
for(seconds = 0; seconds < 60; seconds++) {
printf("Find the child's MsgPort\n");
if (ChildPort = FindPort( CHILD_PORT ))
break;
Delay(50); /* Wait a second! */
}
if (ChildPort == 0L) {
printf("Unable to find child MsgPort!\n");
DeleteTask( ChildTask );
DeletePort( ParentPort );
CloseLibrary( TaskBase );
exit(10);
}
/* Send the child a message. */
message.mn_Node.ln_Type = NT_MESSAGE;
message.mn_ReplyPort = ParentPort;
message.mn_Length = 0;
printf("Sending the message.\n");
PutMsg( ChildPort, &message );
/* Wait for the child to respond. */
WaitPort( ParentPort );
/* Get the message. */
msg = GetMsg( ParentPort );
printf("Got the reply. All done.\n");
/* And now delete the MsgPort we used. */
DeletePort( ParentPort );
/* Finally, close the library. */
CloseLibrary( TaskBase );
exit(0);
}
/* Notice that the child doesn't open any libraries,
* including exec.library and Task.Library whose
* routines it uses. It does this because it will
* operate solely during the life of the parent, when we
* know the libraries will be open. This is not kosher in
* general, but Commodore has produced examples doing this,
* and I know there aren't any problems in this case.
*
* It's also particularly difficult to close a library
* after using DeleteTask() on yourself!
*/
void ChildMain()
{
struct Message *msg;
struct MsgPort *ChildPort;
/* To allow this to be a small code/small data model
* task, we must make sure register A4 contains the
* correct value. We do so by calling the Aztec C
* routine geta4() which computes the value.
*/
geta4();
/* Create a MsgPort where we can receive a message
* from the parent task.
*/
if ((ChildPort = CreatePort( CHILD_PORT, 0L )) == 0)
DeleteTask( FindTask( 0L ));
/* Now wait for the message. */
WaitPort( ChildPort );
/* Fetch it from the port... */
msg = GetMsg( ChildPort );
/* ... and reply to it. Do so inside a Forbid() /
* Permit() pair so there'll be time to delete the
* message port. Note that the Permit() call is
* not included because it will never be called;
* instead, DeleteTask() is called so that we
* delete the current task: ourselves!
*/
Forbid();
ReplyMsg( msg );
DeletePort( ChildPort );
/* Now take the leap of death. */
DeleteTask( FindTask( 0L ));
/* That's all she wrote! */
}